package ec.edu.ucacue.siop.proceso.iniciar.aplicacion;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class LectorExcelUnidadProduccion {
	private ContUnidadFuncional unidadFuncional;
	private ContUnidadFuncional unidadSistema;
	private List<ContUnidadFuncional> listaUnidad = new ArrayList<ContUnidadFuncional>();
	private List<ContMaterial> listaMaterial = new ArrayList<ContMaterial>();
	private List<ContClaseMaterial> listaClaseMaterial = new ArrayList<ContClaseMaterial>();
	private List<Subsistema> listaEquipo = new ArrayList<Subsistema>();
	private List<ContPropiedad> listaPropiedad = new ArrayList<ContPropiedad>();

	public ContUnidadFuncional getUnidadFuncional() {
		return unidadFuncional;
	}

	public void setUnidadFuncional(ContUnidadFuncional unidadFuncional) {
		this.unidadFuncional = unidadFuncional;
	}

	public List<ContMaterial> getListaMaterial() {
		return listaMaterial;
	}

	public void setListaMaterial(List<ContMaterial> listaMaterial) {
		this.listaMaterial = listaMaterial;
	}
	
	public List<Subsistema> getListaEquipo() {
		return listaEquipo;
	}

	public void setListaEquipo(List<Subsistema> listaEquipo) {
		this.listaEquipo = listaEquipo;
	}
	
	public List<ContUnidadFuncional> getListaUnidad() {
		return listaUnidad;
	}

	public void setListaUnidad(List<ContUnidadFuncional> listaUnidad) {
		this.listaUnidad = listaUnidad;
	}

	public List<ContClaseMaterial> getListaClaseMaterial() {
		return listaClaseMaterial;
	}

	public void setListaClaseMaterial(List<ContClaseMaterial> listaClaseMaterial) {
		this.listaClaseMaterial = listaClaseMaterial;
	}

	public ContUnidadFuncional getUnidadSistema() {
		return unidadSistema;
	}

	public void setUnidadSistema(ContUnidadFuncional unidadSistema) {
		this.unidadSistema = unidadSistema;
	}

	public List<ContPropiedad> getListaPropiedad() {
		return listaPropiedad;
	}

	public void setListaPropiedad(List<ContPropiedad> listaPropiedad) {
		this.listaPropiedad = listaPropiedad;
	}

	public boolean leer(String archivo){
		List<ContUnidadFuncional> listaUnidadFuncional = new ArrayList<ContUnidadFuncional>();
		String contenido;
		ContMaterial contClaseMat = null;
		File entrada = new File(archivo);
		try {
			Workbook libroExc = Workbook.getWorkbook(entrada);			
			
			Sheet hoja = libroExc.getSheet(1);
			int tipoDeCargaMaterial = 0;
			// carga la lista de material y las clases de material
			boolean definicionTipo = false;
			for(int i=0; i<hoja.getRows();i++){
				definicionTipo = false;
				
				if(hoja.getCell(0,i).getContents().trim().contentEquals("-Clase")){ 
					tipoDeCargaMaterial = 0;
					definicionTipo = true;
				}
				if(hoja.getCell(0,i).getContents().trim().contentEquals("-Materia")){
					tipoDeCargaMaterial = 1;
					definicionTipo = true;
				}
				if(!definicionTipo) {
					contenido = hoja.getCell(0, i).getContents().trim();
					if(tipoDeCargaMaterial == 0) {
						int ipos = buscarPosicionLCM(listaClaseMaterial, contenido);
						if(ipos == -1) {
							ContClaseMaterial nuevo = new ContClaseMaterial();
							nuevo.setNombreClase(contenido);
							listaClaseMaterial.add(nuevo);
						}
					}
					else
					{
						int iposMat = buscarPosMaterial(listaMaterial, contenido);
						if(iposMat == -1) {
							ContMaterial nuevoMat = new ContMaterial();
							nuevoMat.setNombre(contenido);
							for(int j=1; j<hoja.getColumns(); j++) {
								contenido = hoja.getCell(j, i).getContents().trim();
								if(contenido.length()>0) {
									int pos = buscarPosicionLCM(listaClaseMaterial, contenido);
									if(pos != -1) {
										String nombreClase = contenido;
										nuevoMat.getListaClaseMaterial().add(nombreClase);
									}
								}
							}
							listaMaterial.add(nuevoMat);
						}
					}		
				}

			}
			
			// Lectura de propiedades de la materia
			hoja = libroExc.getSheet(2);
			for(int i =0; i<hoja.getRows(); i++) {
				String contProp = hoja.getCell(0, i).getContents().trim();
				if(contProp.length()>0) {
					ContPropiedad conProp = new ContPropiedad();
					conProp.setNombre(contProp);
					listaPropiedad.add(conProp);
				}
			}

			// Lectura de las unidades funcionales.
			
			hoja = libroExc.getSheet(0);
			for(int i=0; i<hoja.getRows(); i++) {
				if(hoja.getCell(0,i).getContents().trim().length() > 0) {
					unidadFuncional = new ContUnidadFuncional();
					unidadFuncional.setNombreUnidad(hoja.getCell(0,i).getContents().trim());
					unidadFuncional.setListaHija(new ArrayList<ContUnidadFuncional>());
					listaUnidadFuncional.add(unidadFuncional);
					unidadFuncional.setArea("Area");
					
				}
				if(hoja.getCell(1, i).getContents().trim().length()>0) {
					unidadSistema = new ContUnidadFuncional();
					unidadSistema.setArea("Sistema");
					unidadSistema.setNombreUnidad(hoja.getCell(1, i).getContents().trim());
					unidadSistema.setListaVarProceso(new ArrayList<ContVarProceso>());
					if(unidadFuncional!=null) {
						unidadFuncional.getListaHija().add(unidadSistema);
					}
				}
				if(hoja.getCell(2, i).getContents().trim().length()>0) {
					if(unidadSistema != null) {
						ContVarProceso varPro = new ContVarProceso();
						varPro.setNombre(hoja.getCell(2, i).getContents().trim());
						varPro.setUnidadMedida(hoja.getCell(3, i).getContents().trim());
						varPro.setFuenteDato(hoja.getCell(4, i).getContents().trim());
						varPro.setTipo(hoja.getCell(5, i).getContents().trim());
						varPro.setMaterial(hoja.getCell(6, i).getContents().trim());
						unidadSistema.getListaVarProceso().add(varPro);
						
					}
					
				}
				
			}
			listaUnidad = listaUnidadFuncional;
			
		} catch (BiffException e) {
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	private int buscarPosMaterial(List<ContMaterial> listaMaterial2, String contenido) {
		int pos = -1;
		for(int i = 0; i<listaMaterial2.size(); i++) {
			if(contenido.contentEquals(listaMaterial2.get(i).getNombre())){
				pos = i;
			}
		}
		return pos;
	}

	private int buscarPosicionLCM(List<ContClaseMaterial> listaClaseMaterial2, String contenido) {
		int pos = -1;
		for (int i=0; i<listaClaseMaterial2.size(); i++) {
			if(contenido.contentEquals(listaClaseMaterial2.get(i).getNombreClase())) {
				pos = i;
			}
		}
		return pos;
	}

	private List<String> separar(String contents) {
		List<String> result = new ArrayList<String>();
		StringTokenizer tokens = new StringTokenizer(contents,",");
		while(tokens.hasMoreElements()){
			String elemento = tokens.nextToken();
			elemento.trim();
			result.add(elemento);
		}
		return result;
	}
}
